home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / tex / macros / distribs / ftnright / ftnright.doc (.txt) < prev    next >
LaTeX Document  |  1993-05-17  |  36KB  |  813 lines

  1. % \iffalse meta-comment
  2. % Copyright (C) 1989-1992 by Frank Mittelbach.  All rights reserved.
  3. % IMPORTANT NOTICE:
  4. % You are not allowed to change this file.  You may however copy this
  5. % file to a file with a different name and then change the copy.
  6. % You are NOT ALLOWED to distribute this file alone.  You are NOT
  7. % ALLOWED to take money for the distribution or use of this file (or a
  8. % changed version) except for a nominal charge for copying etc.
  9. % You are allowed to distribute this file under the condition that it is
  10. % distributed together with all files mentioned in readme.mz6.
  11. % If you receive only some of these files from someone, complain!
  12. % However, if these files are distributed by established suppliers as
  13. % part of a complete TeX distribution, and the structure of the
  14. % distribution would make it difficult to distribute the whole set of
  15. % files, *those parties* are allowed to distribute only some of the
  16. % files provided that it is made clear that the user will get a complete
  17. % distribution-set upon request to that supplier (not me).  Notice that
  18. % this permission is not granted to the end user.
  19. % For error reports in case of UNCHANGED versions see readme files.
  20. % \fi
  21. \def\filename{ftnright}
  22. \def\fileversion{v1.0d}
  23. \def\filedate{92/06/19}
  24. \def\docdate {92/06/19}
  25. %% \CheckSum{303}
  26. %% \CharacterTable
  27. %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
  28. %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
  29. %%   Digits        \0\1\2\3\4\5\6\7\8\9
  30. %%   Exclamation   \!     Double quote  \"     Hash (number) \#
  31. %%   Dollar        \$     Percent       \%     Ampersand     \&
  32. %%   Acute accent  \'     Left paren    \(     Right paren   \)
  33. %%   Asterisk      \*     Plus          \+     Comma         \,
  34. %%   Minus         \-     Point         \.     Solidus       \/
  35. %%   Colon         \:     Semicolon     \;     Less than     \<
  36. %%   Equals        \=     Greater than  \>     Question mark \?
  37. %%   Commercial at \@     Left bracket  \[     Backslash     \\
  38. %%   Right bracket \]     Circumflex    \^     Underscore    \_
  39. %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
  40. %%   Right brace   \}     Tilde         \~}
  41. % \MakeShortVerb{\|}
  42. %  \DoNotIndex{\;}
  43. %^^A  \DoNotIndex{\@cclv}
  44. %^^A  \DoNotIndex{\@colht}
  45. %^^A  \DoNotIndex{\@colroom}
  46. %  \DoNotIndex{\@combinedblfloats}
  47. %  \DoNotIndex{\@combinefloats}
  48. %  \DoNotIndex{\@dblfloatplacement}
  49. %  \DoNotIndex{\@deferlist}
  50. %  \DoNotIndex{\@empty}
  51. %^^A  \DoNotIndex{\@fcolmadefalse}
  52. %^^A  \DoNotIndex{\@firstcolumnfalse}
  53. %^^A  \DoNotIndex{\@firstcolumntrue}
  54. %  \DoNotIndex{\@freelist}
  55. %  \DoNotIndex{\@ixpt}
  56. %^^A  \DoNotIndex{\@leftcolumn}
  57. %^^A  \DoNotIndex{\@m}
  58. %^^A  \DoNotIndex{\@makecol}
  59. %^^A  \DoNotIndex{\@makefntext}
  60. %^^A  \DoNotIndex{\@maxdepth}
  61. %  \DoNotIndex{\@midlist}
  62. %^^A  \DoNotIndex{\@outputbox}
  63. %^^A  \DoNotIndex{\@outputdblcol}
  64. %^^A  \DoNotIndex{\@outputpage}
  65. %  \DoNotIndex{\@ptsize}
  66. %^^A  \DoNotIndex{\@setsize}
  67. %  \DoNotIndex{\@spaces}
  68. %^^A  \DoNotIndex{\@startcolumn}
  69. %^^A  \DoNotIndex{\@startdblcolumn}
  70. %  \DoNotIndex{\@tempdima}
  71. %  \DoNotIndex{\@textbottom}
  72. %  \DoNotIndex{\@texttop}
  73. %^^A  \DoNotIndex{\@thefnmark}
  74. %  \DoNotIndex{\@viiipt}
  75. %  \DoNotIndex{\@whilesw}
  76. %  \DoNotIndex{\@width}
  77. %^^A  \DoNotIndex{\@xstartcol}
  78. %  \DoNotIndex{\@xpt}
  79. %  \DoNotIndex{\advance}
  80. %  \DoNotIndex{\begingroup}
  81. %  \DoNotIndex{\box}
  82. %^^A  \DoNotIndex{\boxmaxdepth}
  83. %^^A  \DoNotIndex{\columnseprule}
  84. %^^A  \DoNotIndex{\columnwidth}
  85. %  \DoNotIndex{\count}
  86. %  \DoNotIndex{\def}
  87. %  \DoNotIndex{\dimen}
  88. %  \DoNotIndex{\docdate}
  89. %  \DoNotIndex{\dp}
  90. %  \DoNotIndex{\else}
  91. %  \DoNotIndex{\endgroup}
  92. %  \DoNotIndex{\fi}
  93. %  \DoNotIndex{\filedate}
  94. %  \DoNotIndex{\filename}
  95. %  \DoNotIndex{\fileversion}
  96. %^^A  \DoNotIndex{\footins}
  97. %^^A  \DoNotIndex{\footnoterule}
  98. %^^A  \DoNotIndex{\footnotesep}
  99. %^^A  \DoNotIndex{\footnotesize}
  100. %^^A  \DoNotIndex{\ftn@amount}
  101. %  \DoNotIndex{\gdef}
  102. %  \DoNotIndex{\global}
  103. %  \DoNotIndex{\hbox}
  104. %  \DoNotIndex{\hfil}
  105. %  \DoNotIndex{\hss}
  106. %  \DoNotIndex{\ht}
  107. %^^A  \DoNotIndex{\if@fcolmade}
  108. %^^A  \DoNotIndex{\if@firstcolumn}
  109. %  \DoNotIndex{\ifcase}
  110. %^^A  \DoNotIndex{\ifvoid}
  111. %  \DoNotIndex{\ifx}
  112. %^^A  \DoNotIndex{\insert}
  113. %  \DoNotIndex{\ixpt}
  114. %  \DoNotIndex{\let}
  115. %  \DoNotIndex{\llap}
  116. %  \DoNotIndex{\long}
  117. %^^A  \DoNotIndex{\maxdepth}
  118. %^^A  \DoNotIndex{\newdimen}
  119. %^^A  \DoNotIndex{\newskip}
  120. %  \DoNotIndex{\noindent}
  121. %  \DoNotIndex{\normalsize}
  122. %  \DoNotIndex{\or}
  123. %^^A  \DoNotIndex{\parindent}
  124. %^^A  \DoNotIndex{\preparefootins}
  125. %^^A  \DoNotIndex{\rcol@footinsskip}
  126. %^^A  \DoNotIndex{\saved@footinsskip}
  127. %  \DoNotIndex{\setbox}
  128. %  \DoNotIndex{\skip}
  129. %  \DoNotIndex{\space}
  130. %^^A  \DoNotIndex{\strutbox}
  131. %^^A  \DoNotIndex{\textheight}
  132. %^^A  \DoNotIndex{\textwidth}
  133. %  \DoNotIndex{\unvbox}
  134. %  \DoNotIndex{\vbox}
  135. %  \DoNotIndex{\viiipt}
  136. %  \DoNotIndex{\vrule}
  137. %  \DoNotIndex{\vskip}
  138. %^^A  \DoNotIndex{\wlog}
  139. %  \DoNotIndex{\xdef}
  140. %  \DoNotIndex{\xpt}
  141. %  \DoNotIndex{\z@}
  142. % \renewcommand{\.}{\penalty500} %^^A for certain breaks
  143. % \title{Footnotes in a multi-column layout\thanks
  144. %   {The \LaTeX{} style option {\tt \filename} which is described
  145. %    in this article has the version number \fileversion{} dated
  146. %    \filedate. The documentation was last revised on \docdate.}}
  147. % \author{Frank Mittelbach\\
  148. %         Electronic Data Systems (Deutschland) GmbH\\
  149. %          Eisenstra\ss e 56 N15\\
  150. %          D-6090 R\"usselsheim}
  151. % \maketitle
  152. % \pageshrink 1pt  %^^A compensate for the \thanks marker
  153. % \section{Introduction}
  154. % The placement of footnotes in a multi-column layout always bothered
  155. % me. The approach taken by \LaTeX{} (i.e., placing the footnotes
  156. % separately under each column) might be all right if nearly no
  157. % footnotes are present. But it looks clumsy when both columns contain
  158. % footnotes, especially when they occupy different amounts of space.
  159. % In the multi-column style option~\cite{art:FMi89b}, I used page-wide
  160. % footnotes at the bottom of the page, but again the result doesn't
  161. % look very pleasant since short footnotes produce undesired gaps of
  162. % white space. Of course, the main goal of this style option was a
  163. % balancing algorithm for columns which would allow switching between
  164. % different numbers of columns on the same page. With this feature,
  165. % the natural place for footnotes seems to be the bottom of the
  166. % page\footnote{You can not use column footnotes at the bottom, since
  167. % the number of columns can differ on one page.} but looking at some
  168. % of the results it seems best to avoid footnotes in such a layout
  169. % entirely.
  170. % Another possibility is to turn footnotes into endnotes, i.e.,
  171. % printing them at the end of every chapter or the end of the entire
  172. % document.  But I assume everyone who has ever read a book using such
  173. % a layout will agree with me, that it is a pain to search back and
  174. % forth, so that the reader is tempted to ignore the endnotes
  175. % entirely.
  176. % When I wrote the article about ``Future extensions of
  177. % \TeX{}''~\cite{inproc:FMi90} I was again dissatisfied with the
  178. % outcome of the footnotes, and since this article should show certain
  179. % aspects of high quality typesetting, I decided to give the footnote
  180. % problem a try and modified the \LaTeX{} output routine for this
  181. % purpose.  The layout I used was inspired by the yearbook of the
  182. % Gutenberg Gesellschaft Mainz \cite{book:GG}.  Later on, I found that
  183. % it is also recommended by Jan White \cite{book:JWh88}. On the layout
  184. % of footnotes I also consulted books by Jan Tschichold
  185. % \cite{book:JTs87} and Manfred Simoneit \cite{book:MSi89}, books, I
  186. % would recommend to everyone being able to read German texts.
  187. % \subsection{Description of the new layout}
  188. % The result of this effort is presented in this paper and the reader
  189. % can judge for himself whether it was successful or
  190. % not.\footnote{Please note, that this option only changed the
  191. % placement of footnotes. Since this article also makes use of the
  192. % {\tt doc} option \cite{art:fmi89a}, that assigns tiny numbers to
  193. % code lines sprincled throughout the text, the resulting design is
  194. % not perfect.} The main idea for this layout is to assemble the
  195. % footnotes of all columns on a page and place them all together at
  196. % the bottom of the right column. Allowing for enough space between
  197. % footnotes and text, and in addition, setting the footnotes in
  198. % smaller type\footnote{The standard layout in \TUB{} uses the same
  199. % size for footnotes and text, giving the footnotes, in my opinion,
  200. % much too much prominence.} I decided that one could omit the
  201. % footnote separator rule which is used in most publications prepared
  202. % with \TeX{}.\footnote{People who prefer the rule can add it by
  203. % redefining the command {\tt\bslash footnoterule}
  204. % \cite[p.~156]{book:LLa86}. Please, note, that this command should
  205. % occupy no space, so that a negative space should be used to
  206. % compensate for the width of the rule used.} Furthermore, I decided
  207. % to place the footnote markers\footnote{\label{thisftn} The tiny
  208. % numbers or symbols, e.g., the `\ref{thisftn}' in front of this
  209. % footnote.} at the baseline instead of raising them as
  210. % superscripts.\footnote{Of course, this is only done for the mark
  211. % preceeding the footnote text and not the one used within the main
  212. % text where a raised number or symbol set in smaller type will help
  213. % to keep the flow of thoughts, uninterrupted.}
  214. % All in all, I think this generates a neat layout, and surprisingly
  215. % enough, the necessary changes to the \LaTeX{} output routine are
  216. % nevertheless astonishingly simple.
  217. % \subsection{The use of the style option}
  218. % This style option might be used together with any other style option
  219. % for \LaTeX{} which does not change the three internals changed by
  220. % {\tt \filename.sty}.\footnote{These are the macros {\tt\bslash
  221. % @startcolumn}, {\tt\bslash @makecol} and {\tt\bslash @outputdblcol}
  222. % as we will see below.  Of course, the option will take only effect
  223. % with a document style using a twocolumn layout (like {\tt ltugboat})
  224. % or when the user additionally specifies {\tt twocolumn} as a
  225. % document style option in the {\tt\bslash documentstyle} command.} In
  226. % most cases, it is best to use this style option as the very last
  227. % option in the |\documentstyle| command to make sure that its
  228. % settings are not overwritten by other options.\footnote{The {\tt
  229. % ltugboat} option (which is currently set up as a style option
  230. % instead of a document style option which it actually is) will
  231. % overwrite the size used in footnotes if it follows the {\tt
  232. % \filename} option.}
  233. % It is unfortunate that the current \LaTeX{} has no provisions to make
  234. % such changes without overwriting the internal routines. In the new
  235. % \LaTeX{} implementation, we will certainly add some hooks that will
  236. % make such changes more easy.
  237. % The {\tt\filename} option makes use of the values of |\textheight|
  238. % and|\skip|\.|\footins| (the space between text and footnotes). The
  239. % values used are the ones current when {\tt \filename.sty} is read
  240. % in. If the user wants to change either of them in the preamble of
  241. % his document he should call the macro |\preparefootins| afterwards
  242. % to reinitialize the footnote algorithm, e.g.,
  243. % \begin{verbatim}
  244. %  \setlength{\skip\footins}{8pt plus 3pt}
  245. %  \addtolength{\textheight}{1in}
  246. %  \preparefootins
  247. %\end{verbatim}
  248. % This is necessary because the current \LaTeX{} version contains no
  249. % hook at the |\begin{document}| command where we could force an
  250. % execution of |\preparefootins| internally.
  251. % \StopEventually{
  252. % \begin{thebibliography}{1}
  253. % \bibitem{book:GG}
  254. % Hans-Joachim Koppitz, editor.
  255. % \newblock {\em {Gutenberg Jahrbuch}}.
  256. % \newblock Gutenberg-Gesellschaft, Mainz.
  257. % \bibitem{book:LLa86}
  258. % Leslie Lamport.
  259. % \newblock {\em {\LaTeX:} A Document Preparation System}.
  260. % \newblock Addison-Wesley, Reading, Massachusetts, 1986.
  261. % \bibitem{man:LLa90}
  262. % Leslie Lamport.
  263. % \newblock {\em {\tt latex.tex}}, February 1990.
  264. % \newblock {\LaTeX} source version 2.09.
  265. % \bibitem{art:fmi89a}
  266. % Frank Mittelbach
  267. % \newblock The {\tt doc}-option.
  268. % \newblock {\em TUGboat}, 10(2):245--273, July 1989.
  269. % \bibitem{art:FMi89b}
  270. % Frank Mittelbach
  271. % \newblock An environment for multi-column output.
  272. % \newblock {\em TUGboat}, 10(3):407--415, November 1989.
  273. % \bibitem{inproc:FMi90}
  274. % Frank Mittelbach
  275. % \newblock E-{\TeX}: Guidelines to future {\TeX} extensions.
  276. % \newblock In LincolnK. Durst, editor, {\em \TUB}, 11(3):
  277. %   {\em 1990 TUG Annual Meeting Proceedings}, pages
  278. %   337--345, September 1990.
  279. % \bibitem{book:MSi89}
  280. % Manfred Siemoneit.
  281. % \newblock {\em Typographisches {G}estalten}.
  282. % \newblock Polygraph Verlag, Frankfurt am Main, second edition, 1989.
  283. % \bibitem{book:JTs87}
  284. % Jan Tschichold.
  285. % \newblock {\em {Ausgew\"ahlte Aufs\"atze \"uber Fragen der Gestalt des
  286. %   Buches}}.
  287. % \newblock Birkh\"auser Verlag, Basel, 1987.
  288. % \newblock Second printing.
  289. % \bibitem{book:JWh88}
  290. % Jan White.
  291. % \newblock {\em Graphic Design for the Electronic Age}.
  292. % \newblock Watson Guptill, Xerox Press, New York, 1988.
  293. % \end{thebibliography}
  294. %      \PrintIndex
  295. %   }
  296. % \section{The Implementation}
  297. % As usual, we start by identifying the current version of this style
  298. % file in the transcript file.\footnote{Nico Poppelier suggested
  299. % omitting the {\tt\bslash typeout} statements in the production
  300. % version of the files to avoid showing all that unnecessary
  301. % information to the user. While I accept his criticism as valid, I
  302. % decided that this information should at least be placed into the
  303. % transcript file to make it easier to detect problems arising from
  304. % the use of older versions. The command {\tt\bslash wlog} is a
  305. % \PlainTeX{} command that will write its argument to the transcript
  306. % file.}
  307. %    \begin{macrocode}
  308. %<*style>
  309. \wlog{Style Option: `\filename'
  310.   \fileversion\space <\filedate> (FMi)}
  311. \wlog{English Documentation
  312.   \@spaces\@spaces\space <\docdate> (FMi)}
  313. %    \end{macrocode}
  314. % To implement the layout described, above we have to distinguish
  315. % between the left and the right column on a page. For this purpose
  316. % \LaTeX{} maintains the switch |\if@firstcolumn|. When assembling
  317. % material for the left (i.e., the first) column, footnotes should
  318. % take up no space, since they are held over for the second column. In
  319. % the second column these footnotes are combined with the ones found
  320. % there and placed a suitable distance from the main text at the
  321. % bottom of this column.
  322. % This means that we have to change certain parameters for the
  323. % insertion |\footins| when we construct the second column. The right
  324. % place to do this is in the \LaTeX{} macro |\@outputdblcol| which we
  325. % are going to change later on.  What settings for the insertion
  326. % parameters are appropriate? For setting the first column
  327. % |\count|\.|\footins| and |\skip|\.|\footins| should both be zero
  328. % since footnotes are held over while for the second column
  329. % |\count|\.|\footins| should be $1000$ and the |\skip|\.|\footins|
  330. % has to be set to the desired separation between main text and
  331. % footnotes.\footnote{A value of $1000$ means that there is a
  332. % one-to-one relationship between the real size of the footnote and
  333. % the size finally occupied by the footnote on the current page.}
  334. % We will allow one column of footnotes (i.e., the right column) at
  335. % most, so that |\dimen|\.|\footins| has to equal |\textheight|. In
  336. % principle, it would be possible to allow for even more footnotes,
  337. % but this would complicate matters enormously.\footnote{It is not
  338. % possible to make {\tt\bslash dimen\bslash footins} larger than
  339. % {\tt\bslash textheight} directly, because this would result in a
  340. % full left column (with text) and more than one column of footnotes.
  341. % Instead, one has to make footnotes visible to the page generation
  342. % algorithm again at the moment when a full column of footnotes is
  343. % assembled, but we still have some space left in the first column. It
  344. % is a nice enhancement, and, I suppose, it is of some value for
  345. % preparing publications in certain disciplines, so here is the
  346. % challenge~\ldots}
  347. % \begin{macro}{\preparefootins}
  348. % \begin{macro}{\saved@footinsskip}
  349. %    Since a document usually starts with a left column, we have to
  350. %    set |\count| and |\skip|\.|\footins| on top-level to zero. For
  351. %    this purpose, we define a macro |\preparefootins| which will
  352. %    first save the current value of |\skip|\.|\footins| in a safe
  353. %    place. This saved value will be used later for the second column.
  354. %    In this way, it is possible for the user or a designer of a
  355. %    document style to adjust this parameter without fiddling with the
  356. %    code of this style file.
  357. %    \begin{macrocode}
  358. \def\preparefootins{%
  359.   \global\rcol@footinsskip\skip\footins
  360.   \global\skip\footins\z@
  361.   \global\count\footins\z@
  362. %    \end{macrocode}
  363. %    We will also assign |\textheight| to |\dimen|\.|\footins| to
  364. %    allow the user to change this parameter in the preamble.
  365. %    \begin{macrocode}
  366.   \global\dimen\footins\textheight}
  367. %    \end{macrocode}
  368. %    It is necessary to make the assignments above |\global| because
  369. %    we are going to use this macro in the output routine which has an
  370. %    implicit grouping level to keep the changes made by it local.
  371. %  \end{macro}
  372. %    Of course, we have to allocate the {\sf skip} register that we
  373. %    used above:
  374. %    \begin{macrocode}
  375. \newskip\rcol@footinsskip
  376. %    \end{macrocode}
  377. %    \end{macro}
  378. % \begin{macro}{\@outputdblcol}
  379. %    Now we have all the necessary tools available to tackle
  380. %    |\@outputdblcol|.  We have to remember that when
  381. %    |\if@firstcolumn| equals |\iftrue|, we are currently starting to
  382. %    build the second column, i.e., that the first column is already
  383. %    assembled. Therefore, the macro will start with the following
  384. %    code:
  385. %    \begin{macrocode}
  386. \def\@outputdblcol{\if@firstcolumn 
  387.   \global\@firstcolumnfalse
  388. %    \end{macrocode}
  389. %    After changing the switch, we save the first column (which was
  390. %    placed by preceeding macros in |\@outputbox|) in the box register
  391. %    |\@leftcolumn|. Since we are inside the output routine, all those
  392. %    assignments have to be |\global| to take any effect.
  393. %    \begin{macrocode}
  394.   \global\setbox\@leftcolumn\box\@outputbox
  395. %    \end{macrocode}
  396. %    Then, we make the footnotes visible to the page generation
  397. %    algorithm by setting |\count\footins| to $1000$ (|\@m| is an
  398. %    abbreviation for this number) and |\skip\footins| to its saved
  399. %    value (i.e., |\rcol@footinsskip|).
  400. %    \begin{macrocode}
  401.   \global\count\footins\@m
  402.   \global\skip\footins\rcol@footinsskip
  403. %    \end{macrocode}
  404. %    We also have to reinsert all footnotes left over from the first
  405. %    column to make sure that they are reconsidered by the page
  406. %    generation algorithm of \TeX{} using the new values for |\count|
  407. %    and |\skip|\.|\footins|. But this will be done later in the
  408. %    macro |\@startcolumn|.
  409. %    If we have just finished the right column, i.e., when
  410. %    |\if@firstcolumn| equals |\iffalse|, we will reset the |\footins|
  411. %    parameters as explained above using the utitlity macro
  412. %    |\preparefootins|.
  413. %    \begin{macrocode}
  414.  \else \preparefootins
  415. %    \end{macrocode}
  416. %    Then, we compose both columns in |\@outputbox|, combine them with
  417. %    all page-wide floats for this page (|\@combinedblfloats|), attach
  418. %    header and footer, and ship out the result (|\@outputpage|).
  419. %    Finally we look to see whether it is possible to generate
  420. %    following pages consisting only of page-wide
  421. %    floats.\footnote{This part is copied directly from the original
  422. %    \LaTeX{} macro. Details about the used macros, their interfaces
  423. %    and meanings can be found in the \LaTeX{} source
  424. %    code~\cite{man:LLa90}.}
  425. %    \begin{macrocode}
  426.   \global\@firstcolumntrue
  427.   \setbox\@outputbox\vbox{\hbox to\textwidth
  428.     {\hbox to\columnwidth
  429.                   {\box\@leftcolumn\hss}%
  430.      \hfil\vrule\@width\columnseprule\hfil
  431.      \hbox to\columnwidth
  432.                   {\box\@outputbox\hss}}}%
  433.   \@combinedblfloats\@outputpage
  434.   \begingroup
  435.    \@dblfloatplacement\@startdblcolumn
  436.    \@whilesw\if@fcolmade\fi
  437.     {\@outputpage\@startdblcolumn}%
  438.   \endgroup
  439.  \fi}
  440. %    \end{macrocode}
  441. % \end{macro}
  442. % \begin{macro}{\@startcolumn}
  443. % \changes{v1.0b}{90/08/11}{Macro added to correct float problems}
  444. %    There is a fundamental flaw in \LaTeX's output routine for float
  445. %    columns and float pages: split footnotes, i.e., footnotes which
  446. %    are only partly typeset on the preceding page are not resolved.
  447. %    They are held over until \LaTeX{} starts a page (or column)
  448. %    containing text besides floats again. For our current layout,
  449. %    this would mean, that if \LaTeX{} decided to make the right
  450. %    column of a page a float column, footnotes from the left column
  451. %    would appear on a later page. A real cure for this problem would
  452. %    be to rewrite two-thirds of \LaTeX{}'s output routine, so I am
  453. %    leaving this open for the interested reader.
  454. % \begin{figure}[b] 
  455. %   \fbox{%^^A
  456. % \newlength{\puzzlewd}%^^A 
  457. % \setlength{\puzzlewd}{\columnwidth}%^^A 
  458. % \addtolength{\puzzlewd}{-2.1\fboxsep}%^^A 
  459. % \begin{minipage}{\puzzlewd}
  460. %    \vspace{17pt}
  461. %    \begin{center}
  462. %      \bf Puzzle:
  463. %    \end{center}
  464. %    \vspace{-3pt}
  465. %    \small
  466. %    \begin{quote}
  467. % \rightskip \leftmargini plus 2.5em   
  468. % Given a simple \TeX{} document containing only straight text, is
  469. % it possible for the editor,  after
  470. % deleting one sentence, to end up with a document
  471. % producing an extra page?
  472. % We assume that the deleted text contains no \TeX{} macros and
  473. % that the document was prepared
  474. % with a standard macro package like the one used for \TUB\/ production.
  475. %    \end{quote}   
  476. %    \vspace{7pt}
  477. %    \begin{flushright}
  478. %       The answer will be given in the next issue.
  479. %    \end{flushright}
  480. %    \vspace{7pt}
  481. % \end{minipage}}
  482. % \end{figure}
  483. %    But the problem shows up even if only one float is contributed to
  484. %    the right column since \LaTeX{} assumes that the whole column is
  485. %    usable, whereas some of it might actually be already devoted to
  486. %    footnotes from the left column. So we have to change the output
  487. %    routine at least in the part that contributes floats to the next
  488. %    column. The macro involved is called |\@startcolumn|. The first
  489. %    thing we do is to check and see whether any deferred floats
  490. %    exists.
  491. %    \begin{macrocode}
  492. \def\@startcolumn{%
  493.  \ifx\@deferlist\@empty
  494. %    \end{macrocode}
  495. %    If not, we set the switch |\if@fcolmade| to {\tt false} which
  496. %    says that we did not succeed in making a float column. Then, we
  497. %    set |\@colroom| to |\@colht|. The register |\@colht| holds the
  498. %    amount of space that is available for floats, text, and footnotes
  499. %    in one column, i.e., it equals |\textheight| minus the space
  500. %    devoted to page-wide floats. |\@colroom| is a similar register
  501. %    which holds the value |\@colht| minus space for column floats
  502. %    that are already contributed to the current column. Of course,
  503. %    both values should be equal when we start a new column.
  504. %    \begin{macrocode}
  505.    \global\@fcolmadefalse
  506.    \global\@colroom\@colht
  507.  \else
  508. %    \end{macrocode}
  509. %    If there are floats waiting for a change to be processed, the
  510. %    situation is more difficult. In this case, we have to reduce both
  511. %    |\@colht| and |\@colroom| by the amount of space that will be
  512. %    needed for the footnotes from the left column. So we must check
  513. %    whether such footnotes are present. As we have not reinserted
  514. %    them in |\@outputdblcol|, we can check the |\footins| box.
  515. %    \begin{macrocode}
  516.    \ifvoid\footins\else 
  517. %    \end{macrocode}
  518. %    If there are some, we measure the space that will be occupied by
  519. %    them. This measurement is not really exact. If  we have a full
  520. %    column of footnotes, it will be too high, but this does matter
  521. %    since we need it only for an upper bound on the free space
  522. %    available for floats.
  523. %    \begin{macrocode}
  524.      \ftn@amount\ht\footins
  525.      \advance\ftn@amount\dp\footins
  526.      \advance\ftn@amount\skip\footins
  527.    \fi
  528. %    \end{macrocode}
  529. %    We then reduce the |\@colht| by this amount and again assign
  530. %    |\@colroom| the value of |\@colht|. If no footnotes are present,
  531. %    we substract zero, so there is no harm in doing this operation
  532. %    all the time.
  533. %    \begin{macrocode}
  534.    \global\advance\@colht-\ftn@amount
  535.    \global\@colroom\@colht
  536. %    \end{macrocode}
  537. %    Now, we call another internal \LaTeX{} macro that will try to
  538. %    contribute floats to the next column. It will use the register
  539. %    |\@colht| when trying to build up a float column, which is the
  540. %    reason for reducing this register. If it succeeds, it will set the
  541. %    switch |\if@fcolmade| to {\tt true}, otherwise, to {\tt false}. If
  542. %    no float column is possible, it will try to place some or all of
  543. %    the deferred floats to the top or the bottom of the next column,
  544. %    thereby, using and reducing the value of the register |\@colroom|.
  545. %    \begin{macrocode}
  546.    \@xstartcol
  547. %    \end{macrocode}
  548. %    Afterwards, we have to restore the correct values for |\@colht|
  549. %    and |\@colroom| again, but this time, they may differ, so that we
  550. %    have to |\advance| both registers separately by |\ftn@amount|.
  551. %    \begin{macrocode}
  552.    \global\advance\@colht\ftn@amount
  553.    \global\advance\@colroom\ftn@amount
  554. %    \end{macrocode}
  555. %    Now, after doing the things depending on the status of the
  556. %    |\@deferlist|, we have to incorporate the left over footnotes in
  557. %    the new column. First we check whether a float column was
  558. %    produced by |\@xstartcol| or not.
  559. %    \begin{macrocode}
  560.  \if@fcolmade
  561. %    \end{macrocode}
  562. %    If so, we do something awful. To make use of the |\@makecol|
  563. %    macro, which attaches footnotes to |\box| $255$ and places the
  564. %    result in the box register |\@outputbox|, we have to assign
  565. %    |\@outputbox| (i.e., the result of |\@xstartcol|) to |\box|
  566. %    $255$.\footnote{In German, we call this ``from the back through
  567. %    the chest into the eyes''.}
  568. %    \begin{macrocode}
  569.   \setbox\@cclv\box\@outputbox
  570.   \@makecol
  571.  \else
  572. %    \end{macrocode}
  573. %    If no float column was produced, we reinsert the held over
  574. %    footnotes so that they can be reconsidered by the page generation
  575. %    algorithm of \TeX.  But it is necessary to ensure that this
  576. %    operation is done only when footnotes are actually
  577. %    present.\footnote{Otherwise, we might get an undesired extra
  578. %    vertical space coming from {\tt\bslash skip\bslash footins}, even
  579. %    if there are no footnotes on the page.}
  580. %    \begin{macrocode}
  581.    \ifvoid\footins\else
  582.      \insert\footins{\unvbox\footins}\fi
  583.  \fi}
  584. %    \end{macrocode}
  585. % \begin{macro}{\ftn@amount}
  586. %    Of course, we also have to allocate the {\sf dimen} register. It
  587. %    will be automatically initialized to zero.
  588. %    \begin{macrocode}
  589. \newdimen\ftn@amount
  590. %    \end{macrocode}
  591. % \end{macro}
  592. % \end{macro}
  593. % \begin{macro}{\@makecol}
  594. %    The other internal macro that we have to change is |\@makecol|, a
  595. %    macro that is called whenever one column of material is assembled
  596. %    and column floats and footnotes have to be added. Again, we have
  597. %    to distinguish between actions for the first and the second
  598. %    column.
  599. %    \begin{macrocode}
  600. \def\@makecol{\if@firstcolumn
  601. %    \end{macrocode}
  602. %    For the first column, we leave the footnotes in their box and
  603. %    simply save the contents of box $255$ in the |\box| register
  604. %    |\@outputbox|.
  605. %    \begin{macrocode}
  606.   \setbox\@outputbox\box\@cclv
  607. %    \end{macrocode}
  608. %    But if the user errously forgot to specify a twocolumn layout, we
  609. %    will always typeset the first column, so that the footnotes are
  610. %    never printed.  Therefore we better check for this special case
  611. %    and output the footnotes on a separate page in an
  612. %    emergency.\footnote{Otherwise, the footnotes are held over for
  613. %    ever, preventing \TeX{} from finishing the document successfully.
  614. %    Instead, \TeX{} will produce infinity many empty pages at the end
  615. %    of the document, trying in vain to output the held over
  616. %    footnotes.  This problem was found by Rainer Sch\"opf when we
  617. %    prepared the paper for the Cork conference.}
  618. % \changes{v1.0c}{90/08/24}{Introduced crude recovery if
  619. %                           twocolumn false.}
  620. % \changes{v1.0d}{92/06/19}{Better help message}
  621. %    \begin{macrocode}
  622.   \if@twocolumn \else
  623.     \ifvoid\footins \else
  624.       \@latexerr
  625.    {ftnright option used in one-column mode}%
  626.    {The ftnright option was designed to
  627.     work with LaTeX's standard^^Jtwocolumn
  628.     option. It does *not* work with the
  629.     multicol option.^^JSo please specify
  630.     `twocolum' in the \noexpand\documentstyle
  631.     command.}%
  632.       \shipout\box\footins \fi\fi
  633.  \else
  634. %    \end{macrocode}
  635. %    When we construct the second column, we must first check whether
  636. %    footnotes are actually present. If not, we perform the same
  637. %    actions as before.
  638. %    \begin{macrocode}
  639.   \ifvoid\footins
  640.     \setbox\@outputbox\box\@cclv
  641.   \else
  642. %    \end{macrocode}
  643. %    But, if footnotes are present, it may be possible that the whole
  644. %    column consists of footnotes, i.e., |\box| $255$ is empty. In
  645. %    this case, there is no use in placing any glue (|\skip\footins|)
  646. %    in front,\footnote{In fact, it would be a mistake since this glue
  647. %    was not taken into account when the footnotes where assembled, so
  648. %    it would produce an overfull box.} so we have to check for this
  649. %    possibility.
  650. %    \begin{macrocode}
  651.     \setbox\@outputbox\vbox
  652.       {\ifvoid\@cclv \else 
  653.          \unvbox\@cclv
  654.          \vskip\skip\footins\fi
  655. %    \end{macrocode}
  656. %    But in any case, we place the |\footnoterule| in front of the
  657. %    footnotes even if this macro is not used by this style
  658. %    option.\footnote{This decision if certainly open to criticism,
  659. %    since there is nothing to separate. On the other hand, a rule or
  660. %    some other ornament in front of the footnotes is part of the
  661. %    design which should be used concistently throughout a document.
  662. %    As a last argument in favor of the rule, consider the situation
  663. %    where \LaTeX{} decided to place only floats and footnotes into
  664. %    the right hand column. In this case a separator again seems
  665. %    adequate. In this situation one can even argue that it is
  666. %    necessary to put in the {\tt \bslash skip\.\bslash footins}.}
  667. %    This ends the if-statement testing whether footnotes are present
  668. %    or not. It also ends the code which differs depending on the
  669. %    column number.
  670. %    \begin{macrocode}
  671.        \footnoterule\unvbox\footins}\fi
  672.   \fi
  673. %    \end{macrocode}
  674. %    Now the column floats are added at the top and the bottom, and
  675. %    the |\@outputbox| is adjusted to the full column height so that
  676. %    the glue inside will stretch in certain situations.\footnote{It
  677. %    is an interesting question as to whether the current layout works
  678. %    well with bottom floats or not. Actually, I would prefer to place
  679. %    the footnotes below the bottom floats instead of above, as it is
  680. %    done here. At least when the floats are part of the document and
  681. %    not puzzles thrown in.  But I was too lazy to implement it
  682. %    because I seldom use floats. If somebody implements this layout
  683. %    (some parts of this macro have to be changed) I would be
  684. %    interested in seeing the code and some sample results.} Again,
  685. %    this code is copied verbatim from the original source, so I won't
  686. %    dwell on details.\footnote{I only changed {\tt\bslash dimen128}
  687. %    into {\tt\bslash @tempdima} which is, besides being faster and
  688. %    shorter, only a cosmetic change. The use of this hardwired {\sf
  689. %    dimen} register seems to indicate that this part of \LaTeX{} was
  690. %    written very early and left unchanged since then: an interesting
  691. %    fact for software archeologists.} 
  692. %    \begin{macrocode}
  693.   \xdef\@freelist{\@freelist\@midlist}%
  694.   \gdef\@midlist{}\@combinefloats
  695.   \setbox\@outputbox\vbox to\@colht
  696.      {\boxmaxdepth\maxdepth
  697.       \@texttop
  698.       \@tempdima\dp\@outputbox
  699.       \unvbox\@outputbox
  700.       \vskip-\@tempdima
  701.       \@textbottom}%
  702.   \global\maxdepth\@maxdepth}
  703. %    \end{macrocode}
  704. % \end{macro}
  705. % \begin{macro}{\footnotesize}
  706. %    Now we can tackle the remaining small changes to the standard
  707. %    layout.  I decided to use a smaller size for footnotes but with a
  708. %    slightly larger leading than usual. This means that we have to
  709. %    redefine the |\footnotesize| macro which depends on options like
  710. %    {\tt 11pt} etc. Fortunately, there is a simple way to find out
  711. %    the main size of the document: the macro |\@ptsize| contains $0$,
  712. %    $1$, or $2$ standing for $10$, $11$, or $12$ points document text
  713. %    size.
  714. %    \begin{macrocode}
  715. \ifcase \@ptsize
  716. \def\footnotesize{\@setsize\footnotesize
  717.    {9.9pt}\viiipt\@viiipt}
  718. \def\footnotesize{\@setsize\footnotesize
  719.    {11.1pt}\ixpt\@vixpt}
  720. \def\footnotesize{\@setsize\footnotesize
  721.    {12.3pt}\xpt\@xpt}
  722. %    \end{macrocode}
  723. % \end{macro}
  724. % \begin{macro}{\footnoterule}
  725. %    Setting footnotes in smaller type and separating them with
  726. %    sufficiant space from the main text allow us to omit the
  727. %    |\footnoterule| normally used.
  728. %    \begin{macrocode}
  729. \let\footnoterule\@empty
  730. %    \end{macrocode}
  731. % \end{macro}
  732. % \begin{macro}{\footnotesep}
  733. %    Individual footnotes are separated from each other by a more or
  734. %    less baseline skip of the text size. This can be specified with
  735. %    the following code:
  736. %    \begin{macrocode}
  737. {\normalsize
  738. \global\footnotesep\ht\strutbox}
  739. %    \end{macrocode}
  740. %     Braces and |\global| were used to keep the switch to
  741. %    |\normalsize| local, just in case some weird layout starts out
  742. %    with a different text size for some reason.
  743. % \end{macro}
  744. % \begin{macro}{\@makefntext}
  745. %    And finally, a small but nice change, to the mark at the
  746. %    beginning of the footnote text. We will place it at the baseline
  747. %    instead of raising it as a superscript. Additionally, it will get
  748. %    a dot as punctuation.
  749. % \changes{v1.0c}{90/08/24}{Added dot as recommended by Tschichold.}
  750. %    \begin{macrocode}
  751. \long\def\@makefntext#1{\parindent 1em
  752.   \noindent\hbox to 2em{}%
  753.   \llap{$\@thefnmark.\;\;$}#1}
  754. %    \end{macrocode}
  755. % \end{macro}
  756. % \section{Initialisation}
  757. % We defined the macro |\preparefootins| above,  but we also have to use
  758. % it to prepare typesetting the first column. As a default for the
  759. % separation of footnotes and text on the second column, we use the
  760. %    following:
  761. %    \begin{macrocode}
  762. \skip\footins 10pt plus 5pt minus 3pt
  763. \preparefootins
  764. %</style>
  765. %    \end{macrocode}
  766. % Of course, this value can be changed, on by the user as
  767. % described in the introduction.
  768. % \section{The documentation driver file}
  769. % The final bit of code contains the documentation driver file for
  770. % \TeX{}, i.e., the file that will produce the documentation you are
  771. % currently reading. It will be extracted from this file by the {\tt
  772. % docstrip} program.
  773. % \changes{v1.0d}{92/04/19}{Added driver file to source}
  774. %    \begin{macrocode}
  775. %<+drv>\documentstyle[doc,ftnright%
  776. %<+drv>              ,twocolum]{article}
  777. %<+drv>
  778. %<+drv>\newcommand{\TUB}{{\sl TUGboat\/}}
  779. %<+drv>\renewcommand\DescribeMacro[1]{\fbox
  780. %<+drv>          {\PrintDescribeMacro{#1}}}
  781. %<+drv>\renewcommand\DescribeEnv[1]{\fbox
  782. %<+drv>          {\PrintDescribeEnv{#1}}}
  783. %<+drv>\renewcommand\PrintMacroName[1]{}
  784. %<+drv>
  785. %<+drv>\setlength{\textwidth}{39pc} 
  786. %<+drv>\setlength{\textheight}{54pc}
  787. %<+drv>\setlength{\parindent}{1em}
  788. %<+drv>\setlength{\parskip}{2pt plus1pt minus1pt}
  789. %<+drv>\setlength{\oddsidemargin}{0pc} 
  790. %<+drv>\setlength{\marginparwidth}{0pc}
  791. %<+drv>\setlength{\topmargin}{-2.5pc} 
  792. %<+drv>\setlength{\headsep}{20pt}
  793. %<+drv>\setlength{\columnsep}{1.5pc} 
  794. %<+drv>\renewcommand{\bottomfraction}{.4}
  795. %<+drv>
  796. %<+drv>\flushbottom
  797. %<+drv>\CodelineIndex
  798. %<+drv>\EnableCrossrefs
  799. %<+drv>
  800. %<+drv>\setcounter{IndexColumns}{2}
  801. %<+drv>\IndexPrologue{\section{Index}
  802. %<+drv> All numbers denote code lines where
  803. %<+drv> the corresponding entry is used,
  804. %<+drv> underlined entries point to the
  805. %<+drv> definition.}
  806. %<+drv>
  807. %<+drv>\begin{document}
  808. %<+drv>  \DocInput{ftnright.doc}
  809. %<+drv>\end{document}
  810. %    \end{macrocode}
  811. % \Finale
  812. \endinput
  813.